/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.tutwiz.controller;

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author danielwirdehall
 */
public abstract class Controller {
	
	protected String[]			parameters;
	protected String			controller;
	protected String			action;
	private	HttpServletRequest	request;
	private	HttpServletResponse	response;
	protected ArrayList			acceptedFormat = new ArrayList<String>();
	protected String			format = "json";
	protected String			layout = "default";
	
	
	public Controller(String[] parameters, HttpServletRequest request, HttpServletResponse response) {
		
		// Idagsläget endast JSON då det är det enda format på data vi spottar ut.
		// Setting default accepted formats
		acceptedFormat.add("json");
		
		// Sparar undan viktig data i variabler som vi kommer behöva i alla conrollers senare.
		this.request	= request;
		this.response	= response;
		this.controller = parameters[0];
		// Parsar ut action.
		if (!(parameters.length < 2)) {
			this.action	= parameters[1];
		} else {
			this.action = null;
		}
		// Parasar ut resterande input parametrar.
		if (!(parameters.length < 3)) {
			this.parameters = java.util.Arrays.copyOfRange(parameters, 2, parameters.length);
		} else {
			this.parameters = new String[0];
		}
	}
	
	public abstract void doAction();
	
	// En metod för att rendera templates. Kollar att layouten finns för sidan och att formatet är accepterat.
	protected void render(Object o) {
		request.setAttribute("parameters", o);
		request.setAttribute("controller", this.controller);
		request.setAttribute("action", this.action);
		if (this.acceptedFormat.contains(format)) {
			try {
				// Detta ger stöd att i framtiden mata ut filer i olika format t.ex. html, xml, json, pdf osv...
				// I dagsläget är det dock endast json som är implementerat då det var det enda vi behövde.
				// Och då vi inte vill ha en layout på json filerna (då det är ren data) så blir detta lite överflödigt för endast det syftet. 
				request.getRequestDispatcher("/layouts/" + this.layout + "." + format + ".jsp").forward(request, response);
			} catch (Exception ex) {
				this.niceDie("Sidan du frågade efter fanns inte!", 404);
			}
		} else {
			this.niceDie("Vyn du frågade efter finns inte i det formatet du frågade efter!", 404);
		}
	}
	
	// En metod för att skicka ett error medelande till användaren med tillhörande html-header
	protected void niceDie(String errorMessage, int httpErrorCode) {
		request.setAttribute("errorMessage", errorMessage);
		request.setAttribute("errorCode", httpErrorCode);
		try {
			request.getRequestDispatcher("/layouts/error" + "." + format + ".jsp").forward(request, response);
		} catch (Exception ex) {
			try {
				request.getRequestDispatcher("/layouts/error.json.jsp").forward(request, response);
			} catch (Exception exs) {
				
			}
		}
	}
	
}
